<?php

class CalendariosController extends AppController {

    var $name = 'Calendarios';
    var $uses = array('User', 'Client', 'Person', 'Turn', 'Agenda', 'Product','AgendasSegment','ClientsFeriado','License');
    var $helpers = array('Calendar');

    function beforeFilter() {
        parent::beforeFilter();

        // Aplico el Layout segun la Vista o si es AJAX
        if ($this->RequestHandler->isAjax()) {
            $this->layout = 'ajax';
        } else {
            // Cambio la Vista por la del Rol
            $this->layout = strtolower($this->Session->read('VistaActual'));
        }
    }

    function mensual($year = null, $month = null) {

        $month_list = array('january', 'febuary', 'march', 'april', 'may', 'june', 'july', 'august', 'september', 'october', 'november', 'december');
        $day_list = array('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun');

        $data = null;


        if (!$year || !$month) {
            $year = date('Y');
            $month = strtolower(date('F'));
            $month_num = date('n');
        }

        $flag = 0;

        for ($i = 0; $i < 12; $i++) { // check the month is valid if set
            if (strtolower($month) == $month_list[$i]) {
                if (intval($year) != 0) {
                    $flag = 1;
                    $month_num = $i + 1;
                    $month_name = $month_list[$i];
                    break;
                }
            }
        }

        if ($flag == 0) { // if no date set, then use the default values
            $year = date('Y');
            $month = date('M');
            $month_name = date('F');
            $month_num = date('m');
        }

        $this->Turn->recursive = 0;
        $turns = $this->Turn->find('all', array(
            'conditions' => array(
                'Turn.client_id' => $this->Session->read('ClientesUsuarioLogueado.id'),
                'Turn.fecha BETWEEN ? AND ?' => array(date("Y-m-d 00:00:00", mktime(0, 0, 0, $month_num, 1, $year)), date("Y-m-d", mktime(0, 0, 0, $month_num + 1, 1, $year))),
                'NOT' => array('Turn.staterecord_id' => array('2'))
            ),
            'fields' => array('Turn.fecha'),
                ));

        foreach ($turns as $registro) {

            $fecha_registro = substr($registro['Turn']['fecha'], 0, 10);

            if (isset($data[$fecha_registro])) {
                $data[$fecha_registro] ++;
            } else {
                $data[$fecha_registro] = 1;
            }
        }

        $this->set('year', $year);
        $this->set('month', $month);
        $this->set('base_url', "");
        $this->set('data', $data);
    }

    function semanal($anio = null, $mes = null, $dia = null, $id_profesional = null, $visualizacion = 'cal', $ver = 'all') {

        $RolUsuario = strtolower($_SESSION['VistaActual']); //profesional, asistente, administrador

        $data = null;
        $client_id = $this->Session->read('ClientesUsuarioLogueado.id');
        $this->set('client_id', $client_id);

        $profesional_id = $this->Session->read('ProfesionalSeleccionado');
        $this->set('profesional_id', $profesional_id);


        if (!$anio || !$mes || !$dia) {
            $anio = date('Y');
            $mes = date('m');
            $dia = date("d");
        }

        $this->set('visualizacion', $visualizacion);


        $agenda_seleccionada = $this->Session->read('AgendaSeleccionada');
        $this->set('agenda_seleccionada', $agenda_seleccionada);

        //-------------------------------------------------
        // Cuales son los Medicos de este Cliente ?
        $doctors = $this->requestAction('/users/obtenerListadoDoctores/' . $client_id);

        //-------------------------------------------------------------------
        // Cuales son las Agendas de este Cliente?
        $ag = $this->Agenda->find('all', array(
            'conditions' => array(
                'Agenda.client_id' => $client_id,
                'Agenda.staterecord_id' => 1,
            ),
            'order' => array('Agenda.nombre' => 'ASC')
                ));
        $Agendas = array();
        foreach ($ag as $clave => $valor) {
            if (empty($valor['AgendasSegment'])) {
                unset($ag[$clave]);
            } else {
                $Agendas[$valor['Agenda']['user_id']][$valor['Agenda']['id']] = $valor['Agenda']['nombre'];
                //$Agendas[$valor['Agenda']['id']] = $valor['Agenda']['nombre'];
            }
        }

        //---------------------------------------------------------------------
        // Ordena las Agendas por Cleinte
        //---------------------------------------------------------------------
        $Medicos = array();
        foreach ($doctors as $medico_id => $medico_nombre) {
            if (isset($Agendas[$medico_id]) and ! empty($Agendas[$medico_id])) {

                foreach ($Agendas[$medico_id] as $agenda_id => $nombre_agenda) {
                    $Medicos[$medico_id][$agenda_id]['id'] = $medico_id;
                    $Medicos[$medico_id][$agenda_id]['nombre'] = $medico_nombre;
                    $Medicos[$medico_id][$agenda_id]['agenda_id'] = $agenda_id;
                    $Medicos[$medico_id][$agenda_id]['nombre_agenda'] = $nombre_agenda;
                }
            }
        }
        $this->set('Medicos', $Medicos);

        //--------------------------------------------------------------------------------
        // Obtengo el rango de fecha para consultar los turnos (inicio y fin de la semana)
        // De esta manera traigo en la consulta, solo la semana actual, antes traia -7 +7
        //--------------------------------------------------------------------------------
        $DiaActual = mktime(0, 0, 0, $mes, $dia, $anio);
        $dias_menos = date("w", $DiaActual) - 1; //Cantidad de dias a restar para calcular el comienzo de semana
        $dias_mas = 6 - $dias_menos; // Cantidad de dias a sumar para calcular el fin de la semana
        
        $consulta_desde = date("Y-m-d", mktime(0, 0, 0, $mes, $dia - $dias_menos, $anio)); // Primer dia de la semana
        $consulta_hasta = date("Y-m-d", mktime(23, 59, 59, $mes, $dia + $dias_mas, $anio)); // Ultimo dia de la semana

        // Hay Segmentos en la Agenda?
        $hay_segmentos = $this->AgendasSegment->getAgendasSegments($agenda_seleccionada);
        $this->set('hay_segmentos', $hay_segmentos);

        // Configuracion de la Agenda
        $config_agenda = $this->Agenda->getAgendaConfig($client_id, $profesional_id, $agenda_seleccionada);

        // Consulto los Feriados para la Fecha Seleccionada
        $feriados = $this->ClientsFeriado->getClientFeriados($client_id, $consulta_desde, $consulta_hasta );

        // Consulto las Licencias para la Fecha Seleccionada
        $arrLicencias = $this->License->getLicenses($client_id, $profesional_id, $consulta_desde, $consulta_hasta );
        //pr($arrLicencias);
        
        // Obtiene los turnos dados
        $this->set('ver', $ver);
        $turnos = $this->Turn->getTurnos($ver, $client_id, $profesional_id, $agenda_seleccionada, $consulta_desde, $consulta_hasta);

        foreach ($turnos as $registro) {
            // Determino el Nro de la Semana, 1 para Lunes y 7 para el Domingo
            $nro_semana = date("w", strtotime($registro['Turn']['fecha']));
            // Si es Domingo
            if ($nro_semana == 0) { $nro_semana = 7; }


            // Si es un sobreturno, incremento 1 para saber cuantos sobreturnos di para ese segmento
            if( $registro['Turn']['sobreturno'] == 'S' && $registro['Turn']['stateturn_id'] != 3 ){
                $hora_del_turno = substr($registro['Turn']['fecha'],11,5);                
                foreach($config_agenda as $key=>$value){
                    if( $value['Segment']['day_id'] == $nro_semana ){
                        if( $value['Segment']['horario_desde']<= $hora_del_turno && $value['Segment']['horario_hasta']>= $hora_del_turno ){
                            $cant_sobreturnos_dados = $value['Segment']['sobreturnos_dados']+1;
                            $config_agenda[$key]['Segment']['sobreturnos_dados'] = $cant_sobreturnos_dados;
                        }
                    }
                    
                }
                
            }
            
            //-------------- Obtengo el motivo de consulta
            if ($registro['Turn']['producto_id'] > 0) {
                $product = $this->Product->read(null, $registro['Turn']['producto_id']);
                $nombre_producto = $product['Product']['name'];
            } else {
                $nombre_producto = '';
            }


            // Defino el Nombre del Paciente a mostrar (si es temporario o no)
            if (empty($registro['Person']['id'])) {
                $datos_paciente_aux = $registro['Turn']['nota'] . " <small>($nombre_producto)</small>";
            } else {
                $datos_paciente_aux = $registro['Person']['lastname'] . ' ' . $registro['Person']['name'] . " <small>($nombre_producto)</small>";
            }



            // Si el turno está cancelado
            $a_style_turno = '';
            $style_turno = ' style="margin-bottom:10px;" ';

            if ($registro['Turn']['stateturn_id'] == 3) {
                $style_turno = ' style="text-decoration:line-through;margin-bottom:10px;" ';
                $str_checkbox = '';
            } else {
                if ($registro['Turn']['sobreturno'] == 'S') {
                    $style_turno = ' style="margin-bottom:10px;background:#E5FAFA;" ';
                }
                if (empty($registro['Turn']['confirm'])) {
                    $a_style_turno = ' style="color:#CCC; font-style:oblique;" ';
                    $str_checkbox = "<input type='checkbox' style='width:14px;' name='turn_id_" . $nro_semana . "[]' value='{$registro['Turn']['id']}'>";
                } else {
                    $str_checkbox = "<input type='checkbox' style='width:14px;' name='turn_id_" . $nro_semana . "[]' value='{$registro['Turn']['id']}'>";
                }
            }


            // Determino si alguna de las fechas a mostrar son anteriores a HOY y desactive los links
            if (strftime($registro['Turn']['fecha']) < strftime(date("Y-m-d"))) {
                if (isset($data[$registro['Turn']['fecha']])) {
                    $data[$registro['Turn']['fecha']] .= "<p id='card_turno' $style_turno>$datos_paciente_aux</p>";
                } else {
                    $data[$registro['Turn']['fecha']] = "<p id='card_turno' $style_turno>$datos_paciente_aux</p>";
                }
            } else {

                if (!isset($data[$registro['Turn']['fecha']])) {
                    $data[$registro['Turn']['fecha']] = '';
                }

                // Si el Paciente es Temporario
                if (empty($registro['Person']['id'])) {

                    $data[$registro['Turn']['fecha']] .= "<p id='card_turno' $style_turno >$str_checkbox <a href='/people/add/{$registro['Turn']['id']}' $a_style_turno >$datos_paciente_aux</a></p>";
                } else {

                    $data[$registro['Turn']['fecha']] .= "<p id='card_turno' $style_turno >$str_checkbox<a href='/people/view/{$registro['Person']['id']}/99' $a_style_turno >$datos_paciente_aux</a></p>";
                }
            }
        }

        /* ----------------------------------------------------------------------------- */

        $this->set('anio', $anio);
        $this->set('mes', $mes);
        $this->set('dia', $dia);
        $this->set('data', $data);
        $this->set('id_profesional', $this->Session->read('ProfesionalSeleccionado'));
        $this->set('config_agenda', $config_agenda);
        $this->set('feriados', $feriados);
        $this->set('arrLicencias', $arrLicencias);
    }

//end function semanal

    function diario($anio = null, $mes = null, $dia = null, $id_profesional = null, $visualizacion = 'cal', $ver = 'all') {

        $data = null;

        if (!$anio || !$mes || !$dia) {
            $anio = date('Y');
            $mes = date('m');
            $dia = date("d");
        }

        $this->set('visualizacion', $visualizacion);


        $client_id = $this->Session->read('ClientesUsuarioLogueado.id');
        $this->set('client_id', $client_id);

        $profesional_id = $this->Session->read('ProfesionalSeleccionado');
        $this->set('profesional_id', $profesional_id);


        $agenda_seleccionada = $this->Session->read('AgendaSeleccionada');
        $this->set('agenda_seleccionada', $agenda_seleccionada);

        //-------------------------------------------------
        // Cuales son los Medicos de este Cliente ?
        $doctors = $this->requestAction('/users/obtenerListadoDoctores/' . $client_id);

        //-------------------------------------------------------------------
        // Cuales son las Agendas de este Cliente?
        $ag = $this->Agenda->find('all', array(
            'conditions' => array(
                'Agenda.client_id' => $client_id,
                'Agenda.staterecord_id' => 1,
            ),
            'order' => array('Agenda.nombre' => 'ASC')
                ));
        $Agendas = array();
        foreach ($ag as $clave => $valor) {
            if (empty($valor['AgendasSegment'])) {
                unset($ag[$clave]);
            } else {
                $Agendas[$valor['Agenda']['user_id']][$valor['Agenda']['id']] = $valor['Agenda']['nombre'];
                //$Agendas[$valor['Agenda']['id']] = $valor['Agenda']['nombre'];
            }
        }

        //---------------------------------------------------------------------
        // Ordena las Agendas por Cleinte
        //---------------------------------------------------------------------
        $Medicos = array();
        foreach ($doctors as $medico_id => $medico_nombre) {
            if (isset($Agendas[$medico_id]) and ! empty($Agendas[$medico_id])) {

                foreach ($Agendas[$medico_id] as $agenda_id => $nombre_agenda) {
                    $Medicos[$medico_id][$agenda_id]['id'] = $medico_id;
                    $Medicos[$medico_id][$agenda_id]['nombre'] = $medico_nombre;
                    $Medicos[$medico_id][$agenda_id]['agenda_id'] = $agenda_id;
                    $Medicos[$medico_id][$agenda_id]['nombre_agenda'] = $nombre_agenda;
                }
            }
        }
        $this->set('Medicos', $Medicos);


        //--------------------------------------------------------------------------------
        // Obtengo el rango de fecha para consultar los turnos (inicio y fin de la semana)
        // De esta manera traigo en la consulta, solo la semana actual, antes traia -7 +7
        //--------------------------------------------------------------------------------
        $consulta_desde = date("Y-m-d H:i:s", mktime(0, 0, 0, $mes, $dia, $anio)); // Primer dia de la semana
        $consulta_hasta = date("Y-m-d H:i:s", mktime(23, 59, 59, $mes, $dia, $anio)); // Ultimo dia de la semana
        $nro_dia = date("w", strtotime($consulta_desde));
        if ($nro_dia == 0) {
            $nro_dia = 7;
        }

        /* ----------------------------------------------------------------------------- */
        /* Veifico si el Usuario tiene Segmentos creados 								 */
        /* ----------------------------------------------------------------------------- */

        $hay_segmentos = $this->Agenda->query("
				SELECT AgendasSegment.segment_id
				FROM 
					agendas AS Agenda
					INNER JOIN agendas_segments AS AgendasSegment ON AgendasSegment.agenda_id = Agenda.id
				WHERE
					Agenda.client_id = '" . $this->Session->read('ClientesUsuarioLogueado.id') . "' AND Agenda.user_id = '" . $this->Session->read('ProfesionalSeleccionado') . "'
			"
        );

        $this->set('hay_segmentos', $hay_segmentos);

        /* ----------------------------------------------------------------------------- */
        /* Consulto la Configuracion de la Agenda para la Fecha Seleccionada			 */
        /* ----------------------------------------------------------------------------- */

        $config_agenda = $this->Agenda->query("
				SELECT 
					Segment.day_id, Segment.horario_desde, Segment.horario_hasta, Segment.duracion, Segment.sobreturno
				FROM
					agendas AS Agenda 
					INNER JOIN agendas_segments AS AgendasSegment ON AgendasSegment.agenda_id = Agenda.id
					INNER JOIN segments AS Segment ON Segment.id = AgendasSegment.segment_id
				WHERE 
					Agenda.client_id = '" . $this->Session->read('ClientesUsuarioLogueado.id') . "' 
					AND Agenda.user_id = '" . $this->Session->read('ProfesionalSeleccionado') . "'
					AND Segment.day_id = '" . $nro_dia . "'
				ORDER BY 
					Segment.day_id, Segment.horario_desde
			"
        );

        /* ----------------------------------------------------------------------------- */
        /* Consulto los Feriados para la Fecha Seleccionada								 */
        /* ----------------------------------------------------------------------------- */

        $feriados = $this->Agenda->query("
				SELECT 
					Feriado.name, Feriado.fecha
				FROM
					clients_feriados AS ClientsFeriado
					INNER JOIN feriados AS Feriado ON Feriado.id = ClientsFeriado.feriado_id
				WHERE 
					ClientsFeriado.client_id = '" . $this->Session->read('ClientesUsuarioLogueado.id') . "' AND 
					Feriado.fecha >= '" . date("Y-m-d", mktime(0, 0, 0, $mes, $dia - 7, 2010)) . "' AND 
					Feriado.fecha <= '" . date("Y-m-d", mktime(0, 0, 0, $mes, $dia + 7, 2010)) . "'
				ORDER BY 
					Feriado.fecha
			"
        );


        /* ----------------------------------------------------------------------------- */
        /* Consulto los Turnos realizados												 */
        /* ----------------------------------------------------------------------------- */
        if ($ver == 'all') {
            $turnos = $this->Turn->find('all', array(
                'conditions' => array(
                    'Turn.client_id' => $this->Session->read('ClientesUsuarioLogueado.id'),
                    'Turn.doctor_id' => $this->Session->read('ProfesionalSeleccionado'),
                    'Turn.fecha BETWEEN ? AND ?' => array($consulta_desde, $consulta_hasta),
                ),
                'order' => array('Turn.fecha'),
                'fields' => array('Person.id', 'Person.lastname', 'Person.name', 'Turn.fecha', 'Turn.id', 'Turn.nota', 'Turn.stateturn_id', 'Turn.confirm', 'Turn.sobreturno', 'Turn.producto_id'),
                    ));
        } else {
            $turnos = $this->Turn->find('all', array(
                'conditions' => array(
                    'Turn.client_id' => $this->Session->read('ClientesUsuarioLogueado.id'),
                    'Turn.doctor_id' => $this->Session->read('ProfesionalSeleccionado'),
                    'Turn.stateturn_id <>' => 3,
                    'Turn.fecha BETWEEN ? AND ?' => array($consulta_desde, $consulta_hasta),
                ),
                'order' => array('Turn.fecha'),
                'fields' => array('Person.id', 'Person.lastname', 'Person.name', 'Turn.fecha', 'Turn.id', 'Turn.nota', 'Turn.stateturn_id', 'Turn.confirm', 'Turn.sobreturno', 'Turn.producto_id'),
                    ));
        }
        $this->set('ver', $ver);

        foreach ($turnos as $registro) {

            // Determino el Nro de la Semana, 1 para Lunes y 7 para el Domingo
            $nro_semana = date("w", strtotime($registro['Turn']['fecha']));

            // Si el Domingo
            if ($nro_semana == 0) {
                $nro_semana = 7;
            }


            //-------------- Obtenog el motivo de consulta
            if ($registro['Turn']['producto_id'] > 0) {
                $product = $this->Product->read(null, $registro['Turn']['producto_id']);
                $nombre_producto = $product['Product']['name'];
            } else {
                $nombre_producto = '';
            }


            // Defino el Nombre del Paciente a mostrar (si es temporario o no)
            if (empty($registro['Person']['id'])) {
                $datos_paciente_aux = $registro['Turn']['nota'] . " <small>($nombre_producto)</small>";
            } else {
                $datos_paciente_aux = $registro['Person']['lastname'] . ' ' . $registro['Person']['name'] . " <small>($nombre_producto)</small>";
            }


            // Si el turno está cancelado
            $a_style_turno = '';
            $style_turno = ' style="margin-bottom:10px;" ';
            if ($registro['Turn']['stateturn_id'] == 3) {
                $style_turno = ' style="text-decoration:line-through;margin-bottom:10px;" ';
                $str_checkbox = '';
            } else {
                if ($registro['Turn']['sobreturno'] == 'S') {
                    $style_turno = ' style="margin-bottom:10px;background:#E5FAFA;" ';
                }
                if (empty($registro['Turn']['confirm'])) {
                    $a_style_turno = ' style="color:#CCC; font-style:oblique;" ';
                    $str_checkbox = '<input type="checkbox" style="width:30px;" name="turn_id_' . $nro_semana . '[]" value="' . $registro['Turn']['id'] . '">';
                } else {
                    $str_checkbox = '<input type="checkbox" style="width:30px;" name="turn_id_' . $nro_semana . '[]" value="' . $registro['Turn']['id'] . '">';
                }
            }


            if (!isset($data[$registro['Turn']['fecha']])) {
                $data[$registro['Turn']['fecha']] = '';
            }

            // Si el Paciente es Temporario
            if (empty($registro['Person']['id'])) {

                $data[$registro['Turn']['fecha']] .= '<p id="card_turno" ' . $style_turno . ' >' . $str_checkbox . ' <a href="/people/add/' . $registro['Turn']['id'] . '" ' . $a_style_turno . ' >' . $datos_paciente_aux . '</a></p>';
            } else {

                $data[$registro['Turn']['fecha']] .= '<p id="card_turno" ' . $style_turno . ' >' . $str_checkbox . '<a href="/people/view/' . $registro['Person']['id'] . '/99" ' . $a_style_turno . ' >' . $datos_paciente_aux . '</a></p>';
            }
        }

        /* ----------------------------------------------------------------------------- */

        $this->set('anio', $anio);
        $this->set('mes', $mes);
        $this->set('dia', $dia);
        $this->set('data', $data);
        $this->set('id_profesional', $this->Session->read('ProfesionalSeleccionado'));
        $this->set('config_agenda', $config_agenda);
        $this->set('feriados', $feriados);
    }

//end function diario
}

?>